home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル実用編 / ペイント / GPSUBWIN.C < prev    next >
Text File  |  1994-03-10  |  20KB  |  605 lines

  1. /******************************************************************************
  2.  *    gpsubwin.c:    サブウィンドウ関係のモジュール
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <sxmemory.h>        /* メモリマンを利用するときに必要    */
  8. #include <console.h>        /* コンソール系マネージャを利用するときに必要 */
  9. #include <event.h>        /* イベントマンを利用するときに必要    */
  10. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  11. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  12. #include <control.h>        /* コントロールマンを利用するときに必要    */
  13. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  14. #include <task.h>        /* タスクマンを利用するときに必要    */
  15. #include "gpaint.h"        /* このプログラム固有のヘッダファイル    */
  16.  
  17. static    struct {            /* サブウィンドウ情報レコード    */
  18.     Rect winSize;            /* ウィンドウサイズ        */
  19.     Rect wtsize;            /* タイトルバーサイズ        */
  20.     Point loc;            /* 起動時の親ウィンドウに対する相対位置 */
  21.     unsigned long prio;        /* 表示優先度 (高い <<)        */
  22. } subinf[SUBMAX] = {
  23.     {                /* カラー選択ウィンドウ        */
  24.         { 0, 0, 328, 73 },
  25.         { 0, 0, 328, WS_INSIDE_Y },
  26.         { 435, 5 }, 4
  27.     }, {                /* パレット設定ウィンドウ    */
  28.         { 0, 0, 164, 123 },
  29.         { 0, 0, 164, WS_INSIDE_Y },
  30.         { 0, 256 }, 3
  31.     }, {                /* ツール選択ウィンドウ        */
  32.         { 0, 0, 168, 97 },
  33.         { 0, 0, 168, WS_INSIDE_Y },
  34.         { 193, 300 }, 2
  35.     }, {                /* ルーペウィンドウ        */
  36.         { 0, 0, 403, 420 },
  37.         { 0, 0, 403, WS_INSIDE_Y },
  38.         { 361, 83 }, 1
  39.     }
  40. };
  41.  
  42. /******************************************************************************
  43.  *    createSubwin():    サブウィンドウ領域(リージョン)の作成
  44.  ******************************************************************************
  45.  *    引数:    ComVal *pcv    共通変数へのポインタ
  46.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  47.  *                = FALSE: 作成失敗
  48.  */
  49. BOOLEAN createSubwin(ComVal *pcv)
  50. {
  51.     int i;
  52.     Rect rc;
  53.  
  54.     for (i = 0; i < SUBMAX; i++) {
  55.         /* リージョンハンドルの取得 */
  56.         pcv->subRgnHdl[i] = GMNewRgn();
  57.         if (pcv->subRgnHdl[i] == NULL)
  58.             return FALSE;
  59.         /* ウィンドウリージョンの設定 */
  60.         rc = subinf[i].winSize;
  61.         GMRectRgn(pcv->subRgnHdl[i], &rc);
  62.         rc.d.top = rc.d.bottom - 1;
  63.         rc.d.right = 4;
  64.         GMXorRectRgn(pcv->subRgnHdl[i], pcv->subRgnHdl[i], &rc);
  65.         rc.d.left = subinf[i].winSize.d.right - 1;
  66.         rc.d.top = 0;
  67.         rc.d.right = subinf[i].winSize.d.right;
  68.         rc.d.bottom = 4;
  69.         GMXorRectRgn(pcv->subRgnHdl[i], pcv->subRgnHdl[i], &rc);
  70.         rc = (*pcv->subRgnHdl[i])->bounds;
  71.         GMSlideRect(&rc, subinf[i].loc.x_y);
  72.         /* ウィンドウ表示位置を補正 */
  73.         TSAdjustRect(&rc, &rc, 16);
  74.         /* 補正後の座標により、サブウィンドウのリージョンを移動 */
  75.         GMSlideRgn(pcv->subRgnHdl[i], rc.l.l_t);
  76.     }
  77.     /* サブウィンドウはカラー選択ウィンドウとツール選択ウィンドウのみ表示 */
  78.     if (!openSubwin(pcv, 0))
  79.         return FALSE;
  80.  
  81.     if (!openSubwin(pcv, 2))
  82.         return FALSE;
  83.  
  84.     /* 成功したのでTRUEを返す */
  85.     return TRUE;
  86. }
  87.  
  88. /******************************************************************************
  89.  *    openSubwin():    サブウィンドウをオープンする
  90.  ******************************************************************************
  91.  *    引数:    ComVal *pcv    共通変数へのポインタ
  92.  *        int num        サブウィンドウの番号
  93.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  94.  *                = FALSE: 作成失敗
  95.  */
  96. BOOLEAN openSubwin(ComVal *pcv, int num)
  97. {
  98.     /* Sサブウィンドウを作成する */
  99.     pcv->subwinPtr[num] = WSOpen(NULL, pcv->subRgnHdl[num], subinf[num].prio + 200);
  100.  
  101.     if (pcv->subwinPtr[num] == NULL)
  102.         /* サブウィンドウが作成できなかったので終了する */
  103.         return FALSE;
  104.  
  105.     /* タスクIDの上位ワードにサブウィンドウの通し番号を入れる(0以外) */
  106.     pcv->subwinPtr[num]->win.taskID = LONGWORD(num + 1, TSGetID());
  107.     if (!createSubControl(pcv, num))
  108.         return FALSE;
  109.  
  110.     /* 成功したのでTRUEを返す */
  111.     return TRUE;
  112. }
  113.  
  114. /******************************************************************************
  115.  *    createSubControl():    サブウィンドウ内のコントロールの作成
  116.  ******************************************************************************
  117.  *    引数:    ComVal *pcv    共通変数へのポインタ
  118.  *        int num        サブウィンドウの番号
  119.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  120.  *                = FALSE: 作成失敗
  121.  */
  122. BOOLEAN createSubControl(ComVal *pcv, int num)
  123. {
  124.     static Rect rcslvR = { 94, WS_INSIDE_Y + 6, 158, WS_INSIDE_Y + 22 };
  125.     static Rect rcslvG = { 94, WS_INSIDE_Y + 30, 158, WS_INSIDE_Y + 46 };
  126.     static Rect rcslvB = { 94, WS_INSIDE_Y + 54, 158, WS_INSIDE_Y + 70 };
  127.     static Rect rcupdnR = { 16, WS_INSIDE_Y + 4, 90, WS_INSIDE_Y + 24 };
  128.     static Rect rcupdnG = { 16, WS_INSIDE_Y + 28, 90, WS_INSIDE_Y + 48 };
  129.     static Rect rcupdnB = { 16, WS_INSIDE_Y + 52, 90, WS_INSIDE_Y + 72 };
  130.     static Rect rcbtnS = { 92, WS_INSIDE_Y + 76, 122, WS_INSIDE_Y + 95 };
  131.     static Rect rcbtnA = { 130, WS_INSIDE_Y + 76, 160, WS_INSIDE_Y + 95 };
  132.  
  133.     static Rect rcslvX = { 62, WS_INSIDE_Y + 52, 102, WS_INSIDE_Y + 68 };
  134.     static Rect rcslvY = { 122, WS_INSIDE_Y + 52, 162, WS_INSIDE_Y + 68 };
  135.  
  136.     /* テキストタイプに設定 */
  137.     GMSetGraph(&pcv->subwinPtr[num]->win.graph);
  138.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  139.     switch (num) {
  140.     case 1:                /* パレット設定ウィンドウ    */
  141.         /* スライドボリューム(R)を作成する */
  142.         pcv->RGBSlvHdl[0] = CMOpen(&pcv->subwinPtr[PALET]->win,
  143.             &rcslvR, NONTITLE, TRUE, 1, 0, 31, CI_SLDVOL << 4, 0);
  144.         if (pcv->RGBSlvHdl[0] == NULL)
  145.         /* スライドボリューム(R)が作成できなかったので終了する */
  146.             return FALSE;
  147.  
  148.         /* スライドボリューム(G)を作成する */
  149.         pcv->RGBSlvHdl[1] = CMOpen(&pcv->subwinPtr[PALET]->win,
  150.             &rcslvG, NONTITLE, TRUE, 1, 0, 31, CI_SLDVOL << 4, 0);
  151.         if (pcv->RGBSlvHdl[1] == NULL)
  152.         /* スライドボリューム(G)が作成できなかったので終了する */
  153.             return FALSE;
  154.  
  155.         /* スライドボリューム(B)を作成する */
  156.         pcv->RGBSlvHdl[2] = CMOpen(&pcv->subwinPtr[PALET]->win,
  157.             &rcslvB, NONTITLE, TRUE, 1, 0, 31, CI_SLDVOL << 4, 0);
  158.         if (pcv->RGBSlvHdl[2] == NULL)
  159.         /* スライドボリューム(B)が作成できなかったので終了する */
  160.             return FALSE;
  161.  
  162.         /* 数値調整ボタン(R)を作成する */
  163.         pcv->RGBBtnHdl[0] = CMOpen(&pcv->subwinPtr[PALET]->win,
  164.             &rcupdnR, NONTITLE, TRUE, 1, 0, 31, CI_ADJBTN << 4, 0);
  165.         if (pcv->RGBBtnHdl[0] == NULL)
  166.         /* 数値調整ボタン(R)が作成できなかったので終了する */
  167.             return FALSE;
  168.  
  169.         /* 数値調整ボタン(G)を作成する */
  170.         pcv->RGBBtnHdl[1] = CMOpen(&pcv->subwinPtr[PALET]->win,
  171.             &rcupdnG, NONTITLE, TRUE, 1, 0, 31, CI_ADJBTN << 4, 0);
  172.         if (pcv->RGBBtnHdl[1] == NULL)
  173.         /* 数値調整ボタン(G)が作成できなかったので終了する */
  174.             return FALSE;
  175.  
  176.         /* 数値調整ボタン(B)を作成する */
  177.         pcv->RGBBtnHdl[2] = CMOpen(&pcv->subwinPtr[PALET]->win,
  178.             &rcupdnB, NONTITLE, TRUE, 1, 0, 31, CI_ADJBTN << 4, 0);
  179.         if (pcv->RGBBtnHdl[2] == NULL)
  180.         /* 数値調整ボタンが作成できなかったので終了する */
  181.             return FALSE;
  182.  
  183.         /* [設定]ボタンを作成する */
  184.         pcv->setBtnHdl = CMOpen(&pcv->subwinPtr[PALET]->win, &rcbtnS,
  185.             (_LASCII)"\x04設定", TRUE, 1, 0, 1, CI_CHRBTN << 4, 0);
  186.         if (pcv->setBtnHdl == NULL)
  187.         /* [設定]ボタンが作成できなかったので終了する */
  188.             return FALSE;
  189.  
  190.         /* [取消]ボタンを作成する */
  191.         pcv->canBtnHdl = CMOpen(&pcv->subwinPtr[PALET]->win, &rcbtnA,
  192.             (_LASCII)"\x04取消", TRUE, 1, 0, 1, CI_CHRBTN << 4, 0);
  193.         if (pcv->canBtnHdl == NULL)
  194.         /* [取消]ボタンが作成できなかったので終了する */
  195.             return FALSE;
  196.  
  197.         /* ボタン([設定]/[取消])使用不可フラグがオンなら */
  198.         if (pcv->disableBtn) {
  199.             /* 文字ボタンをインアクティブにする */
  200.             CMShine(pcv->setBtnHdl, C_INACTIVE);
  201.             CMShine(pcv->canBtnHdl, C_INACTIVE);
  202.         }
  203.         break;
  204.     case 2:                /* ツール選択ウィンドウ        */
  205.         /* スライドボリュームを作成する */
  206.         pcv->slvHHdl = CMOpen(&pcv->subwinPtr[TOOL]->win, &rcslvX,
  207.             NONTITLE, TRUE, 1, 1, 16, CI_SLDVOL << 4, 0);
  208.         if (pcv->slvHHdl == NULL)
  209.         /* スライドボリュームが作成できなかったので終了する */
  210.             return FALSE;
  211.  
  212.         pcv->slvVHdl = CMOpen(&pcv->subwinPtr[TOOL]->win, &rcslvY,
  213.             NONTITLE, TRUE, 1, 1, 16, CI_SLDVOL << 4, 0);
  214.         if (pcv->slvVHdl == NULL)
  215.         /* スライドボリュームが作成できなかったので終了する */
  216.             return FALSE;
  217.         break;
  218.     }
  219.  
  220.     return TRUE;
  221. }
  222.  
  223. /******************************************************************************
  224.  *    msLDownSubwin(): サブウィンドウのマウスレフトダウンイベント処理
  225.  ******************************************************************************
  226.  *    引数:    ComVal *pcv    共通変数へのポインタ
  227.  *        int num        サブウィンドウの番号(0~3)
  228.  *    注釈:
  229.  *    サブウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
  230.  *    この処理でクローズボタンによる消去、サブウィンドウの移動が可能となります。
  231.  */
  232. void msLDownSubwin(ComVal *pcv, int num)
  233. {
  234.     LPoint lpt, lpos;
  235.     Rect rc = { 0, 0, WS_CLOSE_W, WS_CLOSE_W };
  236.  
  237.     /* サブウィンドウをテキストタイプでカレントグラフにする */
  238.     setGraph(&pcv->subwinPtr[num]->win, G_TXT);
  239.  
  240.     /* 現在の左上隅の座標値を保存 */
  241.     lpos = (*pcv->subRgnHdl[num])->bounds.l.l_t;
  242.     /* 入力座標をローカル座標系に変換する */
  243.     lpt = GMGlobalToLocal(pcv->event.ev.where.x_y);
  244.     /* クローズボタンの位置を算出 */
  245.     GMSlideRect(&rc, LONGWORD(subinf[num].wtsize.d.right - 14, 4));
  246.     /* クローズボタンをチェックする */
  247.     if (GMPtInRect(&rc, lpt)) {
  248.         if (checkPctBtn(pcv, &rc, lpt, 1)) {
  249.             if (num == 3) {
  250.                 /* ルーペウィンドウのクローズなら */
  251.                 if (pcv->subwinPtr[TOOL] != NULL)
  252.                     /* ツールの選択番号を変更するルーペ
  253.                        選択前の状態に戻す */
  254.                     changeTool(pcv, pcv->lupeTool);
  255.                 else {
  256.                     pcv->toolKind = pcv->lupeTool;
  257.                     /* 拡大エリアの消去 */
  258.                     dispLupeRect(pcv);
  259.                     /* サブウィンドウの消去 */
  260.                     disposeSubwin(pcv, num);
  261.                 }
  262.             } else
  263.                 /* サブウィンドウの消去 */
  264.                 disposeSubwin(pcv, num);
  265.         }
  266.     } else if (GMPtInRect(&subinf[num].wtsize, lpt)) {
  267.         /* 押された所がタイトルバー内であれば以下の処理 */
  268.         if (!dragSubwin(pcv, &subinf[num].winSize, lpos, lpt, num)) {
  269.             /* サブウィンドウが作成できなかったので終了する */
  270.             pcv->errorCode = 5; /* ドラッグできなかった    */
  271.             pcv->endFlag = TRUE; /* 終了フラグをセットする    */
  272.         }
  273.     } else {
  274.         /*押された位置がタイトルバーでない*/
  275.         switch (num) {
  276.         case 0:            /* カラー選択ウィンドウ        */
  277.             colorMsLDown(pcv);
  278.             break;
  279.         case 1:            /* パレット設定ウィンドウ    */
  280.             paletMsLDown(pcv);
  281.             break;
  282.         case 2:            /* ツール選択ウィンドウ        */
  283.             toolMsLDown(pcv);
  284.             break;
  285.         case 3:            /* ルーペウィンドウ        */
  286.             lupeMsLDown(pcv);
  287.             break;
  288.         }
  289.     }
  290. }
  291.  
  292. /******************************************************************************
  293.  *    checkPctBtn():    ピクチャーボタンのチェック
  294.  ******************************************************************************
  295.  *    引数:    ComVal *pcv    共通変数へのポインタ
  296.  *        Rect *prc    ピクチャーボタンのレクタングルへのポインタ
  297.  *        LPoint lpt    ポインタ座標(ローカル座標系)
  298.  *    戻り値:    BOOLEAN        = TRUE:  ボタンが押された
  299.  *                = FALSE: ボタンは押されてない
  300.  */
  301. BOOLEAN checkPctBtn(ComVal *pcv, Rect *prc, LPoint lpt, int mode)
  302. {
  303.     BOOLEAN ret = TRUE;
  304.  
  305.     if (!GMPtInRect(prc, lpt))
  306.         return FALSE;
  307.  
  308.     if (mode == 1)
  309.         revFillRect(prc);
  310.     else
  311.         revFrameRect(prc);
  312.     /* マウスボタンが離されるまでループ */
  313.     while (EMLStill()) {
  314.         lpt = EMMSLoc();
  315.         if (GMPtInRect(prc, lpt)) {
  316.             /* ボタン内にカーソルが移動 */
  317.             if (!ret) {
  318.             /* ボタンが押されてなければフレームを反転 */
  319.                 if (mode == 1)
  320.                     revFillRect(prc);
  321.                 else
  322.                     revFrameRect(prc);
  323.                 ret = TRUE;
  324.             }
  325.         } else {
  326.             /* ボタン外にカーソルが移動 */
  327.             if (ret) {
  328.             /* ボタンが押されていたならフレームを反転 */
  329.                 if (mode == 1)
  330.                     revFillRect(prc);
  331.                 else
  332.                     revFrameRect(prc);
  333.                 ret = FALSE;
  334.             }
  335.         }
  336.     }
  337.     /* マウスボタンが離された場合の処理 */
  338.     if (ret) {
  339.         /* ボタンが押されていればフレームを戻す */
  340.         if (mode == 1)
  341.             revFillRect(prc);
  342.         else
  343.             revFrameRect(prc);
  344.     }
  345.     /* ボタンが離された場所をチェック */
  346.     if (!GMPtInRect(prc, lpt))
  347.         return FALSE;
  348.  
  349.     return ret;
  350. }
  351.  
  352. /******************************************************************************
  353.  *    revFillRect():    レクタングル全体の反転
  354.  ******************************************************************************
  355.  *    引数:    Rect *prc    反転するレクタングルへのポインタ
  356.  */
  357. void revFillRect(Rect *prc)
  358. {
  359.     int lastAP, lastFC, lastPM;
  360.  
  361.     /* アクセスページを0と1ページにする */
  362.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  363.     lastPM = GMPenMode(G_XOR);    /* ペンモードをXORにする    */
  364.     lastFC = GMForeColor(G_BLACK);
  365.  
  366.     GMFillRect(prc);
  367.  
  368.     GMForeColor(lastFC);
  369.     GMPenMode(lastPM);
  370.     GMAPage(lastAP);
  371. }
  372.  
  373. /******************************************************************************
  374.  *    revFrameRect():    レクタングルのフレームを反転
  375.  ******************************************************************************
  376.  *    引数:    Rect *prc    反転するレクタングルへのポインタ
  377.  */
  378. void revFrameRect(Rect *prc)
  379. {
  380.     int lastAP, lastFC, lastPM;
  381.  
  382.     /* アクセスページを0と1ページにする */
  383.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  384.     lastPM = GMPenMode(G_XOR);    /* ペンモードをXORにする    */
  385.     lastFC = GMForeColor(G_BLACK);
  386.  
  387.     GMFrameRect(prc);
  388.  
  389.     GMForeColor(lastFC);
  390.     GMPenMode(lastPM);
  391.     GMAPage(lastAP);
  392. }
  393.  
  394. /******************************************************************************
  395.  *    dragSubwin():    サブウィンドウがマウスで動かされたときの処理
  396.  ******************************************************************************
  397.  *    引数:    ComVal *pcv    共通変数へのポインタ
  398.  *        Rect *prc    サブウィンドウのレクタングルへのポインタ
  399.  *        LPoint lpos    押されたときの左上隅の座標
  400.  *        LPoint lpt    押されたときのポインタ座標
  401.  *        int num        サブウィンドウの番号
  402.  *    戻り値:    BOOLEAN        = TRUE:  正常
  403.  *                = FALSE: 異常
  404.  */
  405. BOOLEAN dragSubwin(ComVal *pcv, Rect *prc, LPoint lpos, LPoint lpt, int num)
  406. {
  407.     Point pt, npt, dpt, pt2;
  408.     Rect rc;
  409.  
  410.     /* ルーペの拡大範囲の移動禁止フラグをオン*/
  411.     if (pcv->subwinPtr[LUPE] != NULL)
  412.         pcv->moveLock = TRUE;
  413.  
  414.     /* 点線でラバーバンドを表示する */
  415.     /* サブウィンドウをテキストタイプでカレントグラフにする */
  416.     setGraph(&pcv->subwinPtr[num]->win, G_TXT);
  417.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  418.     OldFC = GMForeColor(G_BLACK);
  419.     OldBC = GMBackColor(G_LGRAY);
  420.     GMInvertRect(prc, WS_RUBBERBAND);
  421.  
  422.     /* サブウィンドウの左上座標からマウスの現在位置までの距離を算出 */
  423.     pt2.p.x = pcv->event.ev.where.p.x - (*pcv->subRgnHdl[num])->bounds.d.left;
  424.     pt2.p.y = pcv->event.ev.where.p.y - (*pcv->subRgnHdl[num])->bounds.d.top;
  425.     rc = *prc;
  426.     pt.x_y = lpt;
  427.     /* ボタンが押されたままになっていれば点線のラバーバンドを移動して表示 */
  428.     while (EMLStill()) {
  429.         /* マウスの現在位置を取得する */
  430.         npt.x_y = EMMSLoc();
  431.         /* マウスが移動された場合のみラバーバンドの移動をする */
  432.         if (pt.x_y != npt.x_y) {
  433.             /* ラバーバンドを消去する */
  434.             GMInvertRect(&rc, WS_RUBBERBAND);
  435.             /* 新なレクタングルの算出 */
  436.             dpt.p.x = npt.p.x - pt.p.x;
  437.             dpt.p.y = npt.p.y - pt.p.y;
  438.             GMSlideRect(&rc, dpt.x_y);
  439.             /* 点線でラバーバンドを描く */
  440.             GMInvertRect(&rc, WS_RUBBERBAND);
  441.         }
  442.         pt = npt;
  443.     }
  444.     /* 離されたら終わり (ラバーバンドを消去する) */
  445.     GMInvertRect(&rc, WS_RUBBERBAND);
  446.     /* サブウィンドウの左上座標を求める */
  447.     pt.p.x -= pt2.p.x;
  448.     pt.p.y -= pt2.p.y;
  449.     /* 新しいリージョンのセット */
  450.     GMSlideRgn(pcv->subRgnHdl[num], pt.x_y);
  451.     /* フォア/バックグラウンドカラーを元に戻す */
  452.     GMForeColor(OldFC);
  453.     GMBackColor(OldBC);
  454.     /* 新しいリージョンをセット */
  455.     GMSlideRect(&rc, lpos);
  456.     (*pcv->subRgnHdl[num])->bounds = rc;
  457.  
  458.     /* サブウィンドウの廃棄 */
  459.     disposeSubwin(pcv, num);
  460.  
  461.     /* サブウィンドウリオープン */
  462.     if (!openSubwin(pcv, num))
  463.         return FALSE;
  464.  
  465.     /* ルーペの拡大範囲の移動禁止フラグをオフ*/
  466.     if (pcv->subwinPtr[LUPE] != NULL)
  467.         pcv->moveLock = FALSE;
  468.  
  469.     return TRUE;
  470. }
  471.  
  472. /******************************************************************************
  473.  *    drawSubwin():    サブウィンドウの描画
  474.  ******************************************************************************
  475.  *    引数:    ComVal *pcv    共通変数へのポインタ
  476.  *        int num        サブウィンドウの番号
  477.  */
  478. void drawSubwin(ComVal *pcv, int num)
  479. {
  480.     int lastPM, lastFC, lastBC;
  481.     Rect rc;
  482.  
  483.     /* サブウィンドウをテキストタイプでカレントグラフにする */
  484.     setGraph(&pcv->subwinPtr[num]->win, G_TXT);
  485.  
  486.     /* ルーペウィンドウ以外ならフォアグラウンドカラーをライトグレーにして
  487.        サブウィンドウ全体を塗りつぶす。ルーペウィンドウならタイトルバーの
  488.        部分のみ塗りつぶし、さらにタートルバー以外の部分は透明にする */
  489.     lastPM = GMPenMode(G_PSET);
  490.     lastFC = GMForeColor(G_LGRAY);    /* フォアグラウンドカラーのセット */
  491.     lastBC = GMForeColor(G_LGRAY);    /* バックグラウンドカラーのセット */
  492.     /* ルーペウィンドウ以外 */
  493.     if (num != 3)
  494.         /* サブウィンドウを塗りつぶす */
  495.         GMFillRect(&subinf[num].winSize);
  496.     else
  497.         /* サブウィンドウを塗りつぶす */
  498.         GMFillRect(&subinf[3].wtsize);
  499.     /* サブウィンドウの外枠を黒で描く */
  500.     GMForeColor(G_BLACK);        /* フォアグラウンドカラーのセット */
  501.     rc = subinf[num].winSize;
  502.     rc.d.right -= 1;
  503.     rc.d.bottom -= 1;
  504.     GMFrameRect(&subinf[num].winSize);
  505.     GMFrameRect(&rc);
  506.  
  507.     drawSubTitleBar(pcv,num);
  508.  
  509.     /* フォア/バックグラウンドカラー、モードを元に戻す */
  510.     GMForeColor(lastFC);
  511.     GMBackColor(lastBC);
  512.     GMPenMode(lastPM);
  513. }
  514.  
  515. /******************************************************************************
  516.  *    drawSubTitleBar():    サブウィンドウのタイトルの描画
  517.  ******************************************************************************
  518.  *    引数:    ComVal *pcv    共通変数へのポインタ
  519.  *        int num        サブウィンドウ番号
  520.  */
  521. void drawSubTitleBar(ComVal *pcv, int num)
  522. {
  523.     int lastAP;
  524.     Rect rc;
  525.  
  526.     /* アクセスページを0と1ページにする */
  527.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  528.     GMForeColor(G_DGRAY);
  529.     rc.l.l_t = LONGWORD(1, 1);
  530.     rc.l.r_b = LONGWORD(subinf[num].wtsize.d.right - 2, 17);
  531.     GMFillRect(&rc);
  532.     GMForeColor(G_WHITE);
  533.     rc.l.r_b = LONGWORD(3, 16);
  534.     GMFillRect(&rc);
  535.     rc.l.l_t = LONGWORD(3, 1);
  536.     rc.l.r_b = LONGWORD(subinf[num].wtsize.d.right - 2, 3);
  537.     GMFillRect(&rc);
  538.     GMForeColor(G_DGRAY);
  539.     rc.l.l_t = LONGWORD(2, 15);
  540.     rc.d.bottom = 18;
  541.     GMFillRect(&rc);
  542.     GMForeColor(G_BLACK);
  543.     rc.l.l_t = LONGWORD(subinf[num].wtsize.d.right - 3, 2);
  544.     rc.d.right++;
  545.     rc.d.bottom--;
  546.     GMFillRect(&rc);
  547.     rc.l.l_t = LONGWORD(1, 16);
  548.     rc.d.right -= 2;
  549.     GMFillRect(&rc);
  550.     rc.l.l_t = LONGWORD(3, 15);
  551.     rc.d.bottom--;
  552.     GMFillRect(&rc);
  553.  
  554.     /* クローズボタンの描画 */
  555.     GMPutRImg(*pcv->tlBtnImg[16], LONGWORD(subinf[num].wtsize.d.right - 14, 4));
  556.     GMAPage(lastAP);
  557. }
  558.  
  559. /******************************************************************************
  560.  *    dispSubwin():    すべてのサブウィンドウを表示/非表示にする
  561.  ******************************************************************************
  562.  *    引数:    ComVal *pcv    共通変数へのポインタ
  563.  *        BOOLEAN dsp    表示/非表示フラグ
  564.  *                = TRUE:  表示
  565.  *                = FALSE: 非表示
  566.  */
  567. void dispSubwin(ComVal *pcv, BOOLEAN dsp)
  568. {
  569.     int i;
  570.  
  571.     for (i = 0; i < SUBMAX; i++)
  572.         if (pcv->subwinPtr[i] != NULL) {
  573.             if (dsp)
  574.                 /* 表示要求なら、サブウィンドウを表示する */
  575.                 WSEnlist(pcv->subwinPtr[i]);
  576.             else
  577.                 /* 非表示要求なら、サブウィンドウを非表示中にする */
  578.                 WSDelist(pcv->subwinPtr[i]);
  579.         }
  580. }
  581.  
  582. /******************************************************************************
  583.  *    disposeSubwin():    サブウィンドウを廃棄する
  584.  ******************************************************************************
  585.  *    引数:    ComVal *pcv    共通変数へのポインタ
  586.  *        int num        サブウィンドウの番号
  587.  */
  588. void disposeSubwin(ComVal *pcv, int num)
  589. {
  590.     switch (num) {
  591.     case 1:                /* パレット設定ウィンドウ    */
  592.     case 2:                /* ツール選択ウィンドウ        */
  593.         CMKill(&pcv->subwinPtr[num]->win); /* コントロールを廃棄する */
  594.         break;
  595.     case 3:                /* ルーペウィンドウ        */
  596.         pcv->moveLock = TRUE;    /*拡大範囲の移動禁止フラグをオン */
  597.         break;
  598.     }
  599.     /* サブウィンドウの廃棄 */
  600.     WSDispose(pcv->subwinPtr[num]);
  601.  
  602.     /* ポインタをクリアする */
  603.     pcv->subwinPtr[num] = NULL;
  604. }
  605.